import subprocess
import time
import pymysql


#arp -n
while True:
    arp_table=subprocess.run("arp -a -i wlan1", shell=True, text=True, capture_output=True)
    arp_entries= arp_table.stdout
    output_log= open("/var/www/html/arp_logs.txt", "w")
    output_log.write(arp_table.stdout)
    output_log.close()

    read_arp_logs = open("/var/www/html/arp_logs.txt", "r")
    for log in read_arp_logs:
        values = log.split(" ") 
        mac= values[3] 
        ip= values[1]
        name=values[0]
        ip_format = ip[1:]
        ip_address= ip_format.replace(')', "")
        mac_address = mac.upper()
        if (mac_address == "<INCOMPLETE>"):
            print(f"Device {name} not connected, IP address still reserved in ARP table.")
        else:
            con = pymysql.connect(host="localhost",user="inaripiadmin79417",password="kali92010linux",database="inari_pi", unix_socket="/run/mysqld/mysqld.sock") 
            cursor = con.cursor()
            retrieve_mac_ip= ("SELECT id_mac_address FROM tbl_device WHERE mac_address = %s and ip_address = %s")
            cursor.execute(retrieve_mac_ip,(mac_address,ip_address))
            rows= cursor.fetchall()
            if not rows:
                print(f"Spoof detected for {mac_address} -> {ip_address} ({name}) Re-builing ARP table...")
                arptables=subprocess.run("sudo arptables -A INPUT --source-mac "+mac+" -i eth0 -j DROP", shell=True)
                turn_denied= ("UPDATE tbl_device SET online = 'n', status = 3, details='Malicious activity detected' WHERE mac_address = %s")
                cursor.execute(turn_denied, mac_address)
                deny_device=subprocess.run("sudo iptables -A INPUT -i eth0 -m mac --mac-source "+mac_address+" -j DROP", shell=True)
                
                           
            else:
                print(f"ARP-table/DB match for {mac_address} -> {ip_address} ({name})")
          
                
            con.commit()
            con.close()
    print("-------------------------------------------------------------------------") 
    time.sleep(15)

